package com.element.controller;

import com.element.entity.Files;
import com.element.vo.Result;
import org.apache.commons.io.IOUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

@RestController
@CrossOrigin
@RequestMapping("/files")
public class FileController {

    // 文件上传
    @PostMapping("/upload")
    public void upload(MultipartFile files) throws IOException {

        // 获取服务器 upload 目录
        String realPath = ResourceUtils.getURL("classpath:").getPath() + "upload";

        // 当日文件目录
        String dateDir = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

        // 如果目录不存在则新建
        File dir = new File(realPath, dateDir);
        System.out.println(dir);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 更改文件名字：日期 + uuid + 文件名
        String newFileNamePrefix = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + UUID.randomUUID().toString();
        String filename = files.getOriginalFilename();
        String extension = filename.substring(filename.lastIndexOf("."));
        String newFileName = newFileNamePrefix + extension;

        // spring自带的上传对象
        files.transferTo(new File(dir, newFileName));
    }

    // 文件下载
    @GetMapping("/download")
    public void download(String fileName, HttpServletResponse response) throws IOException {
        System.out.println(fileName);
        // 获取服务器 upload 目录
        String realPath = ResourceUtils.getURL("classpath:").getPath() + "upload\\";

        // 当日文件目录
        String dir = realPath + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "\\";

        // 获取文件输入流
        FileInputStream is = new FileInputStream(new File(dir, fileName));

        // 设置响应头 attachment：文件下载， inline（默认）：在线打开
        response.setHeader("content-disposition","attachment;fileName=" + fileName);

        // 获取响应输出流
        ServletOutputStream os = response.getOutputStream();

        // 文件拷贝
        IOUtils.copy(is, os);

        IOUtils.closeQuietly(os);
        IOUtils.closeQuietly(is);
    }

    // 查询文件
    @GetMapping("/list")
    public List<Files> fileList() throws FileNotFoundException {
        List<Files> filesList = null;

        // 文件列表
        filesList = new LinkedList<Files>();

        // 获取服务器 upload 目录
        String realPath = ResourceUtils.getURL("classpath:").getPath() + "upload";

        // 当日文件目录
        String dateDir = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

        // 获取目录文件
        File dir = new File(realPath, dateDir);

        if (dir.exists()) {
            File[] list = dir.listFiles();
            for (File f : list) {
                filesList.add(new Files(f.getName()));
            }
        }

        return filesList;
    }
}
